/**
 *
 */
package cn.dw.sg.utils;

import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import org.apache.commons.beanutils.BeanUtils;

import cn.dw.sg.domain.Authority;

/**
 * @author aubrey
 * @date  下午3:20:53
 * 
 */
public class JdbcUtil {
	//静态块---类加载的时候执行
	static {
		System.out.println("静态块");
		try {
			//加载驱动
			Class.forName(PropUtil.getProperty("jdbc.driver"));
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	//构造代码块-----对象被构建的时候执行（new）
	{
		System.out.println("构造块");
	}
	
//	jdbc连接的url参数
	private final static String URL=PropUtil.getProperty("jdbc.url");
//	jdbc连接的user参数
	private final static String USER=PropUtil.getProperty("jdbc.user");
//	jdbc连接的password参数
	private final static String PASSWORD=PropUtil.getProperty("jdbc.password");
	
	
	/**
	 * 用来执行没有返回resultset的sql语句：例如：新增，修改，删除语句
	 * @param sql 要执行的sql
	 */
	public static  void excute(String sql) {
		System.out.println(sql);
		//获取连接
		Connection conn = getConnection();
		Statement statement = null;
		try {
			//获取statement
			statement = conn.createStatement();
			//执行sql
			statement.execute(sql);
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			//释放资源
			release(conn,statement);
		}
	}
	
	/**
	 * 数据库连接的获取
	 * @return Connection 数据库连接
	 */
	public static Connection getConnection() {
		Connection conn = null;
		Statement statement = null;
		//获取连接
		try {
			conn = DriverManager.getConnection(URL, USER, PASSWORD);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}
	
	/***
	 * 释放资源
	 * @param conn 连接的connection对象
	 * @param statement 连接的statemnet对象
	 */
	public static void release(Connection conn , Statement statement ) {
		try {
			if(statement!=null)statement.close();
			if(conn != null)conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 执行查询的sql语句
	 * @param sql 要执行的sql语句
	 * 
	 * @param clazz 要转换成的对象的类
	 * @return
	 */
	public static List<Object> excuteQuery(String sql,Class clazz) {
		System.out.println(sql);
		//获取连接
		Connection conn = getConnection();
		Statement statement = null;
		//最终返回的结果集对象
		List<Object> list = new ArrayList<>();
		try {
			//获取statement
			statement = conn.createStatement();
			//执行sql
			ResultSet result = statement.executeQuery(sql);
			//获取resultset（返回结果集）的元信息数据（例如列名，列的总数）
			ResultSetMetaData metaData = result.getMetaData();
			//返回结果集的列的总数
			int count = metaData.getColumnCount();
			
			//遍历结果集
			while(result.next()) {
				//每一行数据的map对象
				Map map = new HashMap<>();
				
				//遍历结果集中的每一行数据的每列的值
				for(int i = 1 ; i<= count; i++) {
					//拿到对应列的名称（id，name）
					String key = metaData.getColumnLabel(i);
					//每一行数据对应的列的值
					String value = result.getString(i);
					map.put(key, value);
					
				}
				Object tempObj = null;
				try {
					//创建一个对应类的对象
					tempObj = clazz.newInstance();
					//把map转换为bean对象
					BeanUtils.populate(tempObj,map);
				} catch (IllegalAccessException | InvocationTargetException e) {
					e.printStackTrace();
				} catch (InstantiationException e) {
					e.printStackTrace();
				}
//				把每一行数据添加到list集合中
				list.add(tempObj);
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			//释放连接资源
			release(conn,statement);
		}
		//返回转换后的结果集
		return list;
	}
}
